﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using ASPMVCUtil.Helpers;
using ASPMVCUtil.Helpers.Html.JQuery;

namespace System.Web.Mvc.Html
{
    public static class JQueryHelper
    {
        #region efecto
        /// <summary>
        /// Pone el código js para efectura un efecto dado sobre un objeto
        /// </summary>
        /// <param name="efecto">Uno de los valores enumerados en NombreEfecto, referente al nombre del efecto jQuery</param>
        /// <param name="velocidad">Uno de los valores enumerados en VelocidadEfecto</param>
        /// <param name="callback"></param>
        /// <returns></returns>
        public static string EfectoLimpio(NombreEfecto efecto, VelocidadEfecto velocidad, string callback = null)
        {
            return Efecto(efecto, null, velocidad.ToString(), callback);
        }

        /// <summary>
        /// Pone el código js para efectura un efecto dado sobre un objeto
        /// </summary>
        /// <param name="efecto">Uno de los valores enumerados en NombreEfecto, referente al nombre del efecto jQuery</param>
        /// <param name="objeto">Nombre del objeto, que debe ser una variable perteneciente al scope de js donde es llamado</param>
        /// <param name="velocidad">Uno de los valores enumerados en VelocidadEfecto</param>
        /// <param name="callback"></param>
        /// <returns></returns>
        public static string Efecto(NombreEfecto efecto, string objeto, VelocidadEfecto velocidad, string callback = null)
        {
            return Efecto(efecto, objeto, velocidad.ToString(), callback);
        }

        /// <summary>
        /// Pone el código js para efectura un efecto dado sobre un objeto
        /// </summary>
        /// <param name="efecto">Uno de los valores enumerados en NombreEfecto, referente al nombre del efecto jQuery</param>
        /// <param name="objeto">Nombre del objeto, que debe ser una variable perteneciente al scope de js donde es llamado</param>
        /// <param name="velocidad">En milisegundos</param>
        /// <param name="callback"></param>
        /// <returns></returns>
        public static string Efecto(NombreEfecto efecto, string objeto, int velocidad, string callback = null)
        {
            return Efecto(efecto, objeto, velocidad.ToString(), callback);
        }

        private static string Efecto(NombreEfecto efecto, string objeto, string velocidad, string callback = null)
        {
            var s = "";
            if(objeto != null)
                s = objeto + ".effect('" + efecto + "', {}, '" + velocidad + "'";
            else
                s = "effect('" + efecto + "', {}, '" + velocidad + "'";
            if (callback != null)
            {
                s += JS.outl(", function () {");
                s += JS.outl(callback);
                s += "})";
            }
            else
                s += ")";
            if (objeto != null)
                s += JS.outl(";");
            return s;
        }
        #endregion

        #region fadeOut
        public static string fadeOut(string objeto, VelocidadEfecto velocidad, string callback = null, int delay = 0, string onDelay = null)
        {
            return Animacion("fadeOut", objeto, velocidad.ToString(), callback, delay, onDelay);
        }

        public static string fadeOut(string objeto, int velocidad, string callback = null, int delay = 0, string onDelay = null)
        {
            return Animacion("fadeOut", objeto, velocidad + "", callback, delay, onDelay);
        }
        #endregion

        #region fadeIn
        public static string fadeIn(string objeto, VelocidadEfecto velocidad, string callback = null, int delay = 0, string onDelay = null)
        {
            return Animacion("fadeIn", objeto, velocidad.ToString(), callback, delay, onDelay);
        }

        public static string fadeIn(string objeto, int velocidad, string callback = null, int delay = 0, string onDelay = null)
        {
            return Animacion("fadeIn", objeto, velocidad + "", callback, delay, onDelay);
        }
        #endregion

        #region slideDown
        public static string slideDown(string objeto, VelocidadEfecto velocidad, string callback = null, int delay = 0, string onDelay = null)
        {
            return Animacion("slideDown", objeto, velocidad.ToString(), callback, delay, onDelay);
        }

        public static string slideDown(string objeto, int velocidad, string callback = null, int delay = 0, string onDelay = null)
        {
            return Animacion("slideDown", objeto, velocidad + "", callback, delay, onDelay);
        }
        #endregion

        #region slideUp
        public static string slideUp(string objeto, VelocidadEfecto velocidad, string callback = null, int delay = 0, string onDelay = null)
        {
            return Animacion("slideUp", objeto, velocidad.ToString(), callback, delay, onDelay);
        }

        public static string slideUp(string objeto, int velocidad, string callback = null, int delay = 0, string onDelay = null)
        {
            return Animacion("slideUp", objeto, velocidad + "", callback, delay, onDelay);
        }
        #endregion

        private static string Animacion(string animacion, string objeto, string velocidad, string callback, int delay, string onDelay)
        {
            var s = "";
            if (objeto != null)
                s = objeto + "." + animacion + "('" + velocidad + "'";
            else
                s = animacion + "('" + velocidad + "'";
            if (callback != null && !callback.Equals(""))
            {
                s += JS.outl(", function () {");
                s += JS.outl(callback);
                s += "}";
            }
            if (delay > 0)
            {
                s += ").delay(" + delay + ").";
                s += onDelay;
                if (objeto != null)
                    s += JS.outl(";");
                else
                    s += JS.outl();
            }
            else
            {
                if (objeto != null)
                    s += JS.outl(");");
                else
                    s += ")";
            }
            return s;
        }
    }
}